/*
 * @Author: ygnnli 1585923072@qq.com
 * @Date: 2024-08-14 16:45:23
 * @LastEditors: ygnnli 1585923072@qq.com
 * @LastEditTime: 2024-08-21 16:36:27
 * @FilePath: /bitrpc/source/common/fields.hpp
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#pragma once
#include <iostream>
#include <string>
#include <unordered_map>

// 消息类型字段信息定义
namespace bitrpc
{
// 便于后期的更改和维护
#define KEY_METHOD "method"       // 方法
#define KEY_PARAMS "parameters"   // 范围--参数
#define KEY_TOPIC_KEY "topic_key" // 主题
#define KEY_TOPIC_MSG "topic_msg" // 消息
#define KEY_OPTYPE "optype"       // 操作类型
#define KEY_HOST "host"           // 主机
#define KEY_HOST_IP "ip"          // IP
#define KEY_HOST_PORT "port"      // 端口
#define KEY_RCODE "rcode"         // 状态码
#define KEY_RESULT "result"       // 结果

    // 消息类型
    enum class MType
    {
        REQ_RPC = 0,     // RPC请求
        RSP_RPC = 1,     // RPC响应
        REQ_TOPIC = 2,   // 主题请求
        RSP_TOPIC = 3,   // 主题响应
        REQ_SERVICE = 4, // 服务请求
        RSP_SERVICE = 5, // 服务响应
    };

    // 返回码
    enum class RCode
    {
        RCODE_OK = 0,// 成功处理
        RCODE_PARSE_FAILED,// 解析失败
        RCODE_ERROR_MSGTYPE,// 消息类型错误
        RCODE_INVALID_MSG,// 无效消息
        RCODE_DISCONNECTED,// 断开连接
        RCODE_INVALID_PARAMS,// 无效的Rpc调⽤参数
        RCODE_NOT_FOUND_SERVICE,// Rpc服务不存在
        RCODE_INVALID_OPTYPE,// 无效的主题操作类型
        RCODE_NOT_FOUND_TOPIC,// 主题不存在
        RCODE_INTERNAL_ERROR// 内部错误
    };

    static std::string errReason(RCode code)
    {
        static std::unordered_map<RCode, std::string> err_map = {
            {RCode::RCODE_OK, "成功处理！"},
            {RCode::RCODE_PARSE_FAILED, "消息解析失败！"},
            {RCode::RCODE_ERROR_MSGTYPE, "消息类型错误！"},
            {RCode::RCODE_INVALID_MSG, "无效消息"},
            {RCode::RCODE_DISCONNECTED, "连接已断开！"},
            {RCode::RCODE_INVALID_PARAMS, "无效的Rpc参数！"},
            {RCode::RCODE_NOT_FOUND_SERVICE, "没有找到对应的服务！"},
            {RCode::RCODE_INVALID_OPTYPE, "无效的操作类型"},
            {RCode::RCODE_NOT_FOUND_TOPIC, "没有找到对应的主题！"},
            {RCode::RCODE_INTERNAL_ERROR, "内部错误！"}
        };
        // 返回码对应的错误信息
        auto it = err_map.find(code);
        if (it == err_map.end())
        {
            return "未知错误";
        }
        return it->second;
    }

    // 请求类型
    enum class RType
    {
        // REQ_SYNC = 0,     // 同步请求
        REQ_ASYNC = 0,    // 异步请求
        REQ_CALLBACK = 1, // 回调请求
    };

    // 主题操作类型
    enum class TopicOpType
    {
        TOPIC_CREATE = 0,    // 创建主题
        TOPIC_REMOVE = 1,    // 删除主题
        TOPIC_SUBSCRIBE = 2, // 订阅主题
        TOPIC_CANCEL = 3,    // 取消订阅主题
        TOPIC_PUBLISH = 4,   // 发布主题
    };

    // 服务操作类型
    enum class ServiceOptype
    {
        SERVICE_REGISTRY = 0,  // 注册服务
        SERVICE_DISCOVERY = 1, // 发现服务
        SERVICE_ONLINE = 2,    // 服务上线
        SERVICE_OFFLINE = 3,   // 服务下线
        SERVICE_UNKNOW = 4, // 未知操作
    };

}